import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 图表类型转换测试类
 * 验证 chartTypeList 中各种单位的转换效果
 */
public class ChartTypeConversionTest {
    
    public static void main(String[] args) {
        System.out.println("=== chartTypeList 单位转换测试 ===");
        
        // 测试重量类型转换
        testWeightTypeConversion();
        
        // 测试计数类型转换
        testCountTypeConversion();
    }
    
    /**
     * 测试重量类型转换
     */
    private static void testWeightTypeConversion() {
        System.out.println("\n--- 重量类型转换测试 ---");
        
        // 小于1000吨的情况
        testChartItem("纸品类", "672.669", "吨", "672.67", "吨");
        testChartItem("旧衣类", "0.686", "吨", "0.69", "吨");
        testChartItem("塑料类", "0.037", "吨", "0.04", "吨");
        testChartItem("贵重金属", "0.000119", "吨", "0.00", "吨");
        testChartItem("废纸", "999.99", "吨", "999.99", "吨");
        
        System.out.println();
        
        // 大于等于1000吨的情况（转换为千吨）
        testChartItem("大型废料", "1000", "吨", "1.00", "千吨");
        testChartItem("工业废料", "1500.5", "吨", "1.50", "千吨");
        testChartItem("建筑废料", "2345.67", "吨", "2.35", "千吨");
        testChartItem("金属废料", "12000", "吨", "12.00", "千吨");
        testChartItem("超大废料", "1234567", "吨", "1234.57", "千吨");
    }
    
    /**
     * 测试计数类型转换
     */
    private static void testCountTypeConversion() {
        System.out.println("\n--- 计数类型转换测试 ---");
        
        // 台数
        testChartItem("家电", "3.7", "台", "4", "台");
        testChartItem("机器设备", "10.2", "台", "10", "台");
        testChartItem("大型设备", "100.9", "台", "101", "台");
        
        // 辆数
        testChartItem("车辆类", "5.3", "辆", "5", "辆");
        testChartItem("摩托车", "15.8", "辆", "16", "辆");
        
        // 个数
        testChartItem("锂电池类", "10.4", "个", "10", "个");
        testChartItem("小物件", "1000.6", "个", "1001", "个");
        
        // 件数
        testChartItem("服装", "50.2", "件", "50", "件");
    }
    
    /**
     * 测试单个图表项的转换
     */
    private static void testChartItem(String name, String originalValue, String originalUnit, 
                                     String expectedValue, String expectedUnit) {
        BigDecimal value = new BigDecimal(originalValue);
        String unit = originalUnit;
        
        // 模拟转换逻辑
        String resultValue;
        String resultUnit;
        
        switch (unit.toLowerCase().trim()) {
            case "吨":
            case "t":
                // 重量类型：根据大小决定显示吨还是千吨
                String formattedWeight = formatWeightForChart(value);
                resultValue = formattedWeight;
                // 更新单位
                if (value.setScale(2, RoundingMode.HALF_UP).compareTo(new BigDecimal("1000")) >= 0) {
                    resultUnit = "千吨";
                } else {
                    resultUnit = "吨";
                }
                break;
            case "台":
            case "辆":
            case "个":
            case "件":
                // 计数类型：保留整数
                resultValue = value.setScale(0, RoundingMode.HALF_UP).toString();
                resultUnit = unit;
                break;
            default:
                // 其他类型：保留2位小数
                resultValue = value.setScale(2, RoundingMode.HALF_UP).toString();
                resultUnit = unit;
                break;
        }
        
        String status = (resultValue.equals(expectedValue) && resultUnit.equals(expectedUnit)) ? "✓" : "✗";
        System.out.println(status + " " + name + ": " + originalValue + originalUnit + 
                          " -> " + resultValue + resultUnit + 
                          " (期望: " + expectedValue + expectedUnit + ")");
    }
    
    /**
     * 格式化图表中的重量数值（仅返回数值部分）
     */
    private static String formatWeightForChart(BigDecimal weightInTons) {
        if (weightInTons == null) {
            return "0.00";
        }
        
        // 保留2位小数
        BigDecimal formattedWeight = weightInTons.setScale(2, RoundingMode.HALF_UP);
        
        // 如果大于等于1000吨，转换为千吨
        if (formattedWeight.compareTo(new BigDecimal("1000")) >= 0) {
            BigDecimal weightInKiloTons = formattedWeight.divide(new BigDecimal("1000"), 2, RoundingMode.HALF_UP);
            return weightInKiloTons.toString();
        } else {
            return formattedWeight.toString();
        }
    }
}
